/**
 * @author: dn-jinmin/dn-jinmin
 * @doc: 本文件实现了WebSocket的认证接口和默认认证逻辑。认证是许多Web服务中的关键组成部分，
 *       它允许服务器验证客户端的身份并根据身份进行授权。本实现提供了一个基础的认证框架，
 *       包括认证接口和一个简单的认证实现，该实现可根据查询参数或当前时间生成用户ID。
 */

package websocket

import (
	"fmt"
	"net/http"
	"time"
)

// Authentication 定义了WebSocket认证接口，包括认证和获取用户ID两个操作。
type Authentication interface {
	Auth(w http.ResponseWriter, r *http.Request) bool
	UserId(r *http.Request) string
}

// authentication 是Authentication接口的一个实现，提供默认的认证逻辑。
type authentication struct{}

// Auth 实现了Authentication接口的认证方法。当前的实现是开放的，总是返回true。
// 参数:
//
//	w http.ResponseWriter: 用于向客户端发送响应的接口。
//	r *http.Request: 包含客户端请求的结构体。
//
// 返回值:
//
//	bool: 表示认证是否成功，当前始终返回true。
func (*authentication) Auth(w http.ResponseWriter, r *http.Request) bool {
	return true
}

// UserId 实现了Authentication接口的获取用户ID方法。它尝试从请求的查询参数中获取用户ID。
// 如果查询参数中没有用户ID，则使用当前时间的Unix毫秒数作为用户ID。
// 参数:
//
//	r *http.Request: 包含客户端请求的结构体。
//
// 返回值:
//
//	string: 用户ID，优先从查询参数中获取，如果没有则使用当前时间的Unix毫秒数。
func (*authentication) UserId(r *http.Request) string {
	query := r.URL.Query()
	if query != nil && query["userId"] != nil {
		return fmt.Sprintf("%v", query["userId"])
	}

	return fmt.Sprintf("%v", time.Now().UnixMilli())
}
